// 客户端 API 接口集合
// 所需要用到客户端的接口皆在此文件内再次封装

import { Toast } from 'vant';
import * as dd from 'dingtalk-jsapi';
import * as Storage from '@scf/helpers/es/storage';

import Fetch, { buildURL } from '@/apis/fetch';
import * as AppConfigs from '@/configs/app';
import router from '@/router';

/** 是否是开发状态 */
const isDev = process.env.NODE_ENV === 'development';

/**
 * 检测 token 是否已超时
 */

// const checkTokenIsTimeout = () => {
//   // 上一次更新 token 的时间
//   const lastTime = +Storage.getTokenTime();

//   // 从来都没有换成过
//   if (lastTime === 0) {
//     return true;
//   }

//   const nowTime = new Date().getTime();

//   // 当前时间减去一天时间是否还大于上次更新时间
//   return nowTime - 24 * 60 * 60 * 1000 >= lastTime;
// };

/**
 * 注入一个开发状态的 token
 */
// const setDevToken = () => {
//   Storage.setToken(
//     'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJkYXRhb2Z4IiwiaWF0IjoxNjIxNjUyNjg0LCJleHAiOjE2MjE4MjU0ODQsInVzZXJJZCI6NTV9.vmtCWxdiAb2b4gyeqRfY4RCF4DvtC7bDu80TNO0ButQ', //'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJkYXRhb2Z4IiwiaWF0IjoxNTk0Nzk0NDM4LCJleHAiOjE1OTQ5NjcyMzgsInVzZXJJZCI6NTkyMX0.yeJt6DDrNxxZp8w0_qLLRBKXaCTw8jmkSnYjgh3oxg8',
//   );
// };

/**
 * JSAPI 返回的 reject err 信息
 */
export const JSAPI_REJECT_CODES = {
  /** 初始化配置失败 */
  InitConfig: 'JS_API_SIGNATURE_FETCH_FAIL',

  /** 初始化用户登录 */
  InitUserLogin: {
    /** 不在客户端容器 */
    notInClient: 'NOT_IN_CLIENT',

    /** 授权失败 */
    authFail: 'AUTH_FAIL',

    /** 用户登录失败 */
    loginFail: 'LOGIN_FAIL',
  },

  /** 检测当前用户是否有权利访问 */
  CheckAppPrivilege: {
    /** 检测失败 */
    checkFail: 'CHECK_FAIL',

    /** 不再权利范围内 */
    notInPrivilege: 'NOT_IN_PRIVILEGE',
  },
};

/**
 * JSAPI 准备好了
 * @param {() => void} cb 回调事件
 */
export const ready = (cb) => {
  dd.ready(cb);
};

/**
 * 初始化鉴权
 */
export const InitConfig = (jsApiList = []) => {
  return new Promise((resolve, reject) => {
    /** 加密随机字符串 */
    const nonceStr = 'initConfig';

    /** 应用配置 */
    const AppConfig = AppConfigs.getConfig();

    // 加载鉴权配置
    Fetch(buildURL('dingtalk-auth/js-api-signature'), {
      nonceStr,
      url: window.location.href.split('#')[0],
      agentId: AppConfig.agentId.toString(),
    })
      .then(({ data }) => {
        // jsdk 加载好后初始化
        ready(() => {
          // 初始化配置
          dd.config({
            agentId: AppConfig.agentId.toString(), // 必填，微应用ID
            corpId: AppConfig.corpId, // 必填，企业ID
            timeStamp: data.timeStamp.toString(), // 必填，生成签名的时间戳
            nonceStr, // 必填，生成签名的随机串
            signature: data.signature, // 必填，签名
            jsApiList: jsApiList,
          });

          resolve();
        });
      })
      .catch(() => {
        reject(JSAPI_REJECT_CODES.InitConfig);
      });
  });
};

/**
 * 初始化用户免登陆
 */
export const InitUserLogin = () => {
  return new Promise((resolve, reject) => {
    const token = router.history.current.query.token ? router.history.current.query.token : '';
    if (token != '') {
      Storage.setToken(token);
      resolve();
    } else {
      Toast('获取用户信息失败，请重新打开');
      reject('未认证');
    }
  });
};

/**
 * 检测用户是否可以使用当前微应用
 */
export const CheckAppPrivilege = () => {
  return new Promise((resolve) => {
    resolve();
    /** 应用配置 */
    // const AppConfig = AppConfigs.getConfig();

    // Fetch(
    //   buildURL('dingtalk-auth/privileged'),
    //   {
    //     agentId: AppConfig.agentId,
    //   },
    //   'GET',
    // )
    //   .then(({ data }) => {
    //     if (data === 1) {
    //       resolve();
    //     } else {
    //       if (isDev) {
    //         // 开发环境不做过来
    //         resolve();
    //       } else {
    //         reject(JSAPI_REJECT_CODES.CheckAppPrivilege.notInPrivilege);
    //       }
    //     }
    //   })
    //   .catch(() => {
    //     // 用户登录失败
    //     // 接口响应有误
    //     if (isDev) {
    //       // 开发环境不做过来
    //       resolve();
    //     } else {
    //       reject(JSAPI_REJECT_CODES.CheckAppPrivilege.checkFail);
    //     }
    //   });
  });
};

/**
 * setNavigationRight 的参数 感觉这样子写不够直观，非必要字段/属性没法定义
 * @typedef {Object} SetNavigationRightParams
 * @property {boolean} show - 是否显示
 * @property {boolean?} control - 是否控制点击事件，true 控制，false 不控制， 默认false
 * @property {string?} text - 显示的文字
 * @property {()=>void?} onSuccess - 设置成功后的回调
 */

/**
 * 设置导航栏的右边
 * @param {{show?:boolean; control?:boolean; text?:string; onSuccess?:()=>void;}} option 配置参数
 */
export const setNavigationRight = (option) => {
  ready(() => {
    dd.biz.navigation.setRight(option);
  });
};

/**
 * 设置导航栏的标题
 * @param {{title:string}} option 配置
 */
export const setNavigationTitle = (option) => {
  ready(() => {
    dd.biz.navigation.setTitle(option);
  });
};

/**
 * 综合选择，人、部门
 * @param {{title?:string; multiple:boolean; pickedUsers:number[]; pickedDepartments:number[]; disabledDepartments:number[]; requiredUsers:number[]; requiredDepartments:number[]; responseUserOnly:boolean; onSuccess:(r:{selectedCount:number; users:{name:string; avatar:string; emplId:string;}[]; departments:{id:string; name:string; number:number;}[]})=>void;}} option 配置项
 */
export const showComplexPicker = (option) => {
  ready(() => {
    /** 应用配置 */
    const AppConfig = AppConfigs.getConfig();

    dd.biz.contact.complexPicker({
      title: '选择', // 标题
      corpId: AppConfig.corpId, // 企业的corpId
      appId: AppConfig.agentId, // 微应用的Id
      limitTips: '超出了', // 超过限定人数返回提示
      maxDepartments: 1000, // 最大选择部门数量
      pickedUsers: [],
      pickedDepartments: [],
      disabledDepartments: [], // 不可选部门
      requiredUsers: [],
      requiredDepartments: [], // 必选部门（不可取消选中状态）
      ...option,
    });
  });
};

/**
 * 显示选择部门 Picker
 * @param {{title?:string; multiple:boolean; limitTips?:string; maxDepartments?:number; pickedDepartments?:number[]; disabledDepartments:number[]; requiredDepartments:number[]; onSuccess: (r:{departments:{id:number;name:string}[]})=>void;}} option 选择部门的参数
 */
export const showDepartmentsPicker = (option) => {
  ready(() => {
    /** 应用配置 */
    const AppConfig = AppConfigs.getConfig();

    const formatting = (ids = []) => ids.map((i) => (+i === 1 ? -1 : i));

    dd.biz.contact.departmentsPicker({
      title: '组织结构范围', // 标题
      corpId: AppConfig.corpId, // 企业的corpId
      appId: AppConfig.agentId, // 微应用的Id
      limitTips: '超出了', // 超过限定人数返回提示
      maxDepartments: 1000, // 最大选择部门数量
      pickedDepartments: formatting(option.pickedDepartments),
      disabledDepartments: formatting(option.disabledDepartments), // 不可选部门
      requiredDepartments: formatting(option.requiredDepartments), // 必选部门（不可取消选中状态）
      ...option,
      onSuccess: (r) => {
        option.onSuccess &&
          option.onSuccess({
            ...r,
            departments: r.departments.map((item) => ({
              ...item,
              id: Math.abs(item.id),
            })),
          });
      },
    });
  });
};

/**
 * 选择外部联系人
 * @param {{pickedUsers?:string[]; disabledUsers:string[]; requiredUsers:string[]; onSuccess:(r:{emplId:string; name:string;}[])=>void;}} option 配置
 */
export const showExternalComplexPicker = (option) => {
  ready(() => {
    /** 应用配置 */
    const AppConfig = AppConfigs.getConfig();

    dd.biz.contact.externalComplexPicker({
      title: '选择',
      corpId: AppConfig.corpId, // 企业的corpId
      limitTips: '超出了',
      maxUsers: 1000, //默认不限制
      pickedUsers: [], //已选，但可取消，只针对多选生效
      disabledUsers: [], //不可选，，只针对多选生效
      requiredUsers: [], //必选，只针对多选生效
      ...option,
    });
  });
};

/**
 * 新窗口打开链接
 * @param {{url:string; onSuccess:()=>void;}} option 配置项
 * @param {boolean} isSelf 是否是自身应用
 */
export const openLink = (option, isSelf = false) => {
  console.log(this.$router);
  // 如果是自身应用就自动拼接
  if (isSelf) {
    option.url = `${window.location.origin}${window.location.pathname}${window.location.search}#${option.url}`;
  }

  if (isDev) {
    window.open(option.url);
  } else {
    dd.biz.util.openLink(option);
  }
};

/**
 * 返回上一页
 * @param {{onFail?()=>void;}} option 配置项
 */
export const goBack = (option) => {
  dd.biz.navigation.goBack(option);
};

/**
 * 打开应用
 * @param {{agentId:any; corpId?:any; onFail?:(e:any)=>void}} option 配置项
 */
export const openApp = (option) => {
  dd.biz.microApp.openApp(option);
};

/**
 * 显示分享组件
 * @param {{type:number; url:string; title:string; content?:string; image?:string;}} option 配置项
 */
export const showShare = (option) => {
  dd.biz.util.share(option);
};

/**
 * 预览图片
 * @param {{urls:string[]; current:string;}} option 配置项
 */
export const previewImage = (option) => {
  dd.biz.util.previewImage(option);
};

/** 获取设备手机基础信息 */
export const getPhoneInfo = () => {
  return new Promise((resolve) => {
    dd.device.base.getPhoneInfo({
      onSuccess: (data) => {
        resolve(data);
      },
    });
  });
};

/** 获取地理信息位置 */
export const getGeography = () => {
  return new Promise((resolve) => {
    ready(() => {
      dd.device.geolocation.get({
        targetAccuracy: Number,
        coordinate: Number,
        withReGeocode: Boolean,
        useCache: true,
        onSuccess: (data) => {
          resolve(data);
        },
      });
    });
  });
};
